﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CBE.Model;
using System.Data.Objects.DataClasses;
using Common.DataAccess;

namespace CBE.DataAccess
{
    public class AdministrarVentasDataAccess
        : GenericEntityManagerDataAccess<Ventas, AdministrarVentasCriteria, AdministrarVentasView, CBEEntities>
    {

        public AdministrarVentasDataAccess()
            : base()
        {
            this.RelatedEntitySets.Add("ProductosVenta");
            this.RelatedEntitySets.Add("ServiciosVenta");
        }

        protected override Ventas ReadEntity(Guid id)
        {
            return ObjectContext.Ventas.
                Include("Clientes").
                Include("ProductosVenta.Productos").
                Include("Promociones").
                Include("Turnos").
                Include("ServiciosVenta").
                Include("ServiciosVenta.Servicios").
                Where(venta => venta.ID_Venta == id).
                FirstOrDefault();
        }

        public override List<AdministrarVentasView> Read(AdministrarVentasCriteria criteria)
        {
            return ObjectContext.Ventas.
                Where(venta => (String.IsNullOrEmpty(criteria.NombreApellido) || venta.Clientes.Apellido.Contains(criteria.NombreApellido) || venta.Clientes.Nombre.Contains(criteria.NombreApellido)) &&
                               (!criteria.Fecha.HasValue || (criteria.Fecha.Value == venta.FechaVenta)) &&
                               (String.IsNullOrEmpty(criteria.NroDocumento) || venta.Clientes.NumeroDocumento.Contains(criteria.NroDocumento)) &&
                               venta.Activo == true
                               ).
                Select(venta => new AdministrarVentasView
                {
                    ID = venta.ID_Venta,
                    FechaVenta = venta.FechaVenta.Value,
                    NombreApellido = venta.Clientes.Nombre + " " + venta.Clientes.Apellido,
                    NroDocumentoCliente = venta.Clientes.NumeroDocumento,
                    ImporteBonificado = venta.ImporteBonificado.HasValue ? venta.ImporteBonificado.Value : 0,
                    ImporteProductos = venta.ImporteProductos.HasValue ? venta.ImporteProductos.Value : 0,
                    ImporteServicio = venta.ImporteServicios.HasValue ? venta.ImporteServicios.Value : 0,
                    ImporteTotal = venta.Importe.HasValue ? venta.Importe.Value : 0
                }).OrderBy(t => t.NroDocumentoCliente).ToList();
        }

        public override void Save(Ventas entity)
        {
            if (entity.Turnos != null)
            {
                this.FinalizarTurno(entity);
            }
            if (entity.ChangeTracker.State == Common.Model.ObjectState.Added)
            {
                this.DecrementarStockProducto(entity);
            }

            base.Save(entity);
        }

        private void DecrementarStockProducto(Ventas entity)
        {
            foreach (var item in entity.ProductosVenta)
            {
                item.Productos.Stock -= item.Cantidad.HasValue ? item.Cantidad.Value : 0;
            }
        }

        private void FinalizarTurno(Ventas entity)
        {
            entity.Turnos.Finalizado = true;
        }

        public void Cancelar(Common.Model.ViewEntity viewEntity)
        {
            var entity = this.Read(viewEntity.ID);

            entity.Activo = false;

            if (entity.Turnos != null)
            {
                this.DeshacerFinalizarTurno(entity);
            }
            this.DeshacerDecrementoStock(entity);

            this.Save(entity);
        }

        private void DeshacerDecrementoStock(Ventas entity)
        {
            foreach (var item in entity.ProductosVenta)
            {
                item.Productos.Stock += item.Cantidad.HasValue ? item.Cantidad.Value : 0;
            }
        }

        private void DeshacerFinalizarTurno(Ventas entity)
        {
            entity.Turnos.Finalizado = false;
        }
    }
}